#ifndef __HEAP_H
#define __HEAP_H

#include <stdbool.h>

/*获取左子树*/
#define heap_index_left(x)      (2 * x + 1)
/*获取右子树*/
#define heap_index_right(x)     (2 * x + 2)
/*获取双亲*/
#define heap_index_parent(x)    ((x - 1) / 2)


/**
 * @brief 堆结构体
 * @note data 为数据首地址
 * capacity 为数据最大容量
 * size 为当前实际数据量
 * vptr 虚函数指针
*/
typedef struct heap
{
    struct{
        bool (*cmp_int)(int,int);
    }*vptr;
    int *data;
    int capacity;
    int size;
}Heap,*heap_t;


/*公共函数*/
void heap_min_init(heap_t zs,int capacity,int *data);
void heap_max_init(heap_t zs,int capacity,int *data);
void heap_build(heap_t zs,int *arr,int size,void (*init)(heap_t,int,int *));
void heap_adjust_down(heap_t zs,int index);
void heap_adjust_up(heap_t zs,int index);
void heap_insert(heap_t zs,int data);
int heap_pop(heap_t zs);
void heap_trav(heap_t zs,void (*look)(int));


#endif /*__HEAP_H*/